\documentclass[10.5pt, a4paper]{article}

\usepackage{xeCJK}
\newCJKfontfamily{\heiti}[AutoFakeBold={3.17}]{SimHei}

\usepackage{geometry}
\geometry{
    left = 0.6in,
    right = 0.6in,
    top = 0.8in,
    bottom = 1.0in
}
\usepackage{amssymb,amsbsy,amsmath,xcolor,mathrsfs,graphicx}
\usepackage{listings}
\usepackage{tasks}
\settasks{
    label = \Alph*. ,
    label-width = 16pt
}

\renewcommand{\title}[3]{
    \begin{center}
        \Large\heiti #1~年~#2~月 Python~#3级考试
    \end{center}
}
\newcommand{\TimeAndName}[1]{
    \begin{center}
        考试时间:~#1~ 分钟 \qquad\qquad\qquad\qquad 姓名:\underline{\quad\quad\quad\quad}
    \end{center}
}

\begin{document}
    \lstset{
        language = python,
        keywordstyle = \color{orange}\bfseries,
        emph = {print,bool,chr,ord,sorted,float,type,oct,hex,abs,sum,len,int,open,list,map,
        str,min},
        emphstyle = \color{purple}\bfseries,
        showspaces = false,
        basicstyle = \ttfamily,
        morekeywords = {True,False}
    }

    \title{2020}{9}{二}
    
    \TimeAndName{60}
    
    \vspace{1cm}
    {\noindent\heiti 第一部分、单选题(共 25 题,每题 2 分,共50分.)}

    \begin{enumerate}
        % 1
        \item \lstinline{numbers=[1,11,111,9]},运行\lstinline{numbers.sort()}后,再运行\lstinline{numbers.reverse()},\lstinline{numbers}会变成?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{[1,9,11,111]}
            \task \lstinline{[1,11,111]}
            \task \lstinline{[111,11,9,1]}
            \task \lstinline{[9111111]}
        \end{tasks}

        % 2
        \item 执行下列代码,输出的结果是?(\qquad)
        \begin{lstlisting}
            word = "China"
            num = 3
            string = 'python'
            total = string * (len(word)-num)
            print(total)
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline{pythonpython}
            \task \lstinline{'python''python'}
            \task \lstinline{python}
            \task \lstinline{'python'}
        \end{tasks}

        % 3
        \item 下列案例的输出结果是什么?(\qquad)
        \begin{lstlisting}
            t1 = (1,2,3,4,5,6,7)
            t2 = ("a","b","c","d","e","f")
            a1 = t1[2:]
            a2 = t2[2:5]
            s = a1 + a2
            print(s)
        \end{lstlisting}
        \begin{tasks}(2)
            \task \lstinline{(3,4,5,6,7,"c","d","e")}
            \task \lstinline{(4,5,6,7,"b","c","d","e")}
            \task \lstinline{(1,2,3,4,5,"c","d","e")}
            \task \lstinline{(3,4,5,6,7,"a","b","c")}
        \end{tasks}

        % 4
        \item 已知\lstinline{i=[4,5,6]},执行\lstinline{i[len(i):]=[1,2,3]},i的结果是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{[1,2,3]}
            \task \lstinline{[4,5,6,1,2,3]}
            \task \lstinline{[1,2,3,4,5,6]}
            \task \lstinline{[4,5,6]}
        \end{tasks}

        % 5
        \item \lstinline{numbers=[1,3,2,8], numbers[len(numbers)-1]}会返回什么?(\qquad)
        \begin{tasks}(4)
            \task 1
            \task 3
            \task 2
            \task 8
        \end{tasks}

        % 6
        \item \lstinline{str1="学习力,思考力,行动力,创造力"},那么\lstinline{print(str1[4:7])}的结果是?(\qquad)
        \begin{tasks}(4)
            \task 思考力,
            \task ,思考力
            \task 思考力
            \task ,思考力,
        \end{tasks}

        % 7
        \item 下面代码将打印出什么数字?(\qquad)
        \begin{lstlisting}
            numbers = [1,3,2,8,9]
            print(numbers[1] + numbers[3])
        \end{lstlisting}
        \begin{tasks}(4)
            \task 3
            \task 11
            \task 4
            \task 9
        \end{tasks}

        % 8
        \item \lstinline!d1={'a':100,'b':200,'c':300}!.下面什么代码可以将 d1 改成\lstinline!{'a':150,'b':200,'c':300}!?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{d1[0]=150}
            \task \lstinline{d1[a]=150}
            \task \lstinline{d1['a']=150}
            \task \lstinline{d1[1000]=150}
        \end{tasks}

        % 9
        \item \lstinline!words={"Chinese":"中文","English":"英语","French":"法语","Korean":"韩语"}!运行以下代码后输出的结果是?(\qquad)
        \begin{lstlisting}
            del words["French"]
            print(len(words))
        \end{lstlisting}
        \begin{tasks}(4)
            \task 6
            \task 3
            \task 8
            \task 4
        \end{tasks}

        % 10
        \item 下列关于字符串的描述正确的是?(\qquad)
        \begin{tasks}
            \task 字符串是一个可变的序列
            \task 我们可以通过\lstinline!min()!来获取字符串的长度
            \task 字符串是用一对双引号\lstinline!""!或者单引号\lstinline!''!括起来的零个或者多个字符
            \task 我们可以通过\lstinline!str.upper()!将字符串中的所有大写字母变成小写字母
        \end{tasks}

        % 11
        \item \lstinline!courses=["语文","数学","编程","英语"]!,运行\lstinline!courses.pop()!后course会变成?(\qquad)
        \begin{tasks}(2)
            \task \lstinline{["数学","编程","英语"]}
            \task \lstinline{["语文","数学","编程"]}
            \task \lstinline{["语文","数学","英语"]}
            \task \lstinline{["数学","编程","英语"]}
        \end{tasks}

        % 12
        \item 关于字典的描述错误的是?(\qquad)
        \begin{tasks}(2)
            \task 字典的元素以键为索引进行访问
            \task 字典的长度是可变的
            \task 字典的一个键可以对应多个值
            \task 字典是键值对的结合,键值对之间没有顺序
        \end{tasks}

        % 13
        \item 执行下列代码,输出的结果是?(\qquad)
        \begin{lstlisting}
            lis = [1,2,3,4,5,6]
            del lis[1:2]
            lis.remove(4)
            lis[0] = lis.pop(0)
            print(lis)
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline{[3,5,6]}
            \task \lstinline{[3,6]}
            \task \lstinline{[1,5,6]}
            \task \lstinline{[5,6]}
        \end{tasks}

        % 14
        \item 下面的代码将打印什么?(\qquad)
        \begin{lstlisting}
            poem = "明日复明日"
            for i in poem:
                if i == "明":
                    continue
                print(i)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 明复明
            \task 日复日
            \task 明日复明日
            \task 明明
        \end{tasks}
        
        % 15
        \item \lstinline!numbers=[1,3,2,8]!,运行\lstinline!numbers.append(2)!后,numbers会变成?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{[1,3,2,8]}
            \task \lstinline{[2,1,3,2,8]}
            \task \lstinline{[1,3,2,8,2]}
            \task \lstinline{[1,3,8]}
        \end{tasks}

        % 16
        \item 下列语句中,无法创建字典dic的是?(\qquad)
        \begin{tasks}(2)
            \task \lstinline!dic={"chinese":90,math":95}!
            \task \lstinline!dic=dict([("chinese",90),("math", 95)])!
            \task \lstinline!dic=dict(chinese=90, math=95)!
            \task \lstinline!dic={[("chinese",90),("math",95)]}!
        \end{tasks}

        % 17
        \item 若要创建一个包含1、2、3、4四个数字的列表a,下列哪个方法是错误的?(\qquad)
        \begin{tasks}(4)
            \task \lstinline!a=1,2,3,4!
            \task \lstinline!a=[1,2,3,4]!
            \task \lstinline!a=list(range(1,5))!
            \task \lstinline!a=list([1,2,3,4])!
        \end{tasks}

        % 18
        \item 下列关于分支和循环结构的描述中,错误的是?(\qquad)
        \begin{tasks}
            \task while循环只能用来实现无限循环
            \task 所有的for循环都可以用while循环改写
            \task 保留字break可以终止一个循环
            \task continue可以停止后续代码的执行,从循环的开头重新执行
        \end{tasks}

        % 19
        \item 以下构成 Python循环结构的方法中,正确的是?(\qquad)
        \begin{tasks}(4)
            \task while
            \task loop
            \task if
            \task do...for
        \end{tasks}

        % 20
        \item 下面哪个选项是下面程序的输出结果?(\qquad)
        \begin{lstlisting}
            for j in range(0,3):
                print(j, end=" ")
        \end{lstlisting}
        \begin{tasks}(4)
            \task 1~2
            \task 0~1~2~3
            \task 0~1~2
            \task 1~2~3
        \end{tasks}

        \newpage
        % 21
        \item 执行下面程序,结果是?(\qquad)
        \begin{lstlisting}
            i = 1
            while i <= 10:
                i += 1
                if i%2 > 0:
                    continue
                print(i)
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline{1 3 5 7}
            \task \lstinline{2 4 6 8 10}
            \task \lstinline{2 4 6 8}
            \task \lstinline{1 3 5 7 9}
        \end{tasks}

        % 22
        \item 下列关于元组的描述错误的是?(\qquad)
        \begin{tasks}(2)
            \task 元组是可包含任意对象的有序集合
            \task 元组和字符串都可以通过下标索引访问元素
            \task 元组可以任意嵌套
            \task 元组是可变的序列
        \end{tasks}

        % 23
        \item 对于元组里面的元素,可以执行的操作有?(\qquad)
        \begin{tasks}(4)
            \task 读取
            \task 添加
            \task 修改
            \task 删除
        \end{tasks}

        % 24
        \item 运行以下代码后,输出的结果是?(\qquad)
        \begin{lstlisting}
            for i in range(9):
                if i*i > 40:
                    break
            print(i)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 7
            \task 9
            \task 8
            \task 6
        \end{tasks}

        % 25
        \item \lstinline!character=["诚实","感恩","坚持","守时]!,运行以下代码的结果是?(\qquad)
        \begin{lstlisting}
            if not("怜悯" in character):
                character.append("怜悯")
            print(character[1]+ character[-1])
        \end{lstlisting}
        \begin{tasks}(4)
            \task 诚实守时
            \task 诚实怜悯
            \task 感恩守时
            \task 感恩怜悯
        \end{tasks}
    \end{enumerate}

    \vspace{1cm}
    {\noindent\heiti 第二部分、判断题(共 10 题,每题 2 分,共20分.)}
    \begin{enumerate}
        \setcounter{enumi}{25}
        % 26
        \item \lstinline!continue!语句的作用是结束整个循环的执行.(\qquad)

        %27
        \item \lstinline!>>> "{:06.2f}".format(3.2455)!,运行结果为:3.25(\qquad)
        
        %28
        \item 表达式\lstinline!6 if 3 > 2 else 5!的值为6.(\qquad)
  
        %29
        \item 以下程序的作用是对整数0-9求和.(\qquad)
        \begin{lstlisting}
            s = 0
            for i in range(10):
                s = s+i
            print(s)
        \end{lstlisting}
        
        %30
        \item 字典是可变对象,字典有键(key)和值(value),其中键(key)和值(value)都是不可以重复的.(\qquad)
        
        %31
        \item \lstinline!if [3] in [1,2,3,4]:!与\lstinline!if 3 in [1,2,3,4]:!结果是一样的.(\qquad)
        
        %32
        \item 普通字符串,采用双引号(\lstinline!""!)包裹起来,用采用单引号(\lstinline!''!)包裹起来的不是字符串,如果:\lstinline!a="word"!属于字符串,\lstinline!a='word'!不属于字符串.(\qquad)
        
        %33
        \item 若运行程序
        \begin{lstlisting}
            t1 = (45)
            print(type(t1))
        \end{lstlisting}
        则输出结果为\lstinline!<class 'tuple'>!.(\qquad)
        
        %34
        \item 元组\lstinline!d=(2020,1,1)!,执行\lstinline!d=(d[0]+1,1,1)!后,d是(2021,1,1).(\qquad)
        
        %35
        \item 切片操作\lstinline!list(range(10))[0:8:2]!执行结果为\lstinline!([0,2,4,6,8])!.(\qquad)
    \end{enumerate}

    \newpage
    {\noindent\heiti 第三部分、编程题(共 2 题,共30分.)}
    \begin{enumerate}
        \setcounter{enumi}{35}
        
        % 36
        \item 质数
        
        提示用户输入两个正整数,编程求出介于这两个数之间的所有质数并打印输出.
        
        显示格式为\lstinline!"xxx是质数"!
        \vfill

        %37
        \item 查询区号
        
        编写一段程序,用于查询用户输入的区号.

        当用户输入区号时,程序输出对应的诚实.可多次查询.测试区号是:

        020广州、021上海、022天津、023重庆、024沈阳、025南京
        \vfill
    \end{enumerate}

    \newpage
    \begin{center}
        \Huge \heiti 参考答案
    \end{center}

        \begin{tasks}[label=\arabic*.](5)
            \task C %1
            \task A %2
            \task A %3
            \task B %4
            \task D %5

            \task C
            \task B
            \task C
            \task B
            \task C

            \task B
            \task C
            \task C
            \task B
            \task C

            \task D
            \task A
            \task A
            \task A
            \task C

            \task B
            \task D
            \task A
            \task A
            \task D

            \task $\times$
            \task $\times$
            \task $\checkmark$
            \task $\checkmark$
            \task $\times$

            \task $\times$
            \task $\times$
            \task $\times$
            \task $\checkmark$
            \task $\times$
        \end{tasks}

        \begin{enumerate}
            \setcounter{enumi}{35}
            \item \begin{lstlisting}
                start = int(input("请输入开始:"))
                end = int(input("请输入结束:"))

                for i in range(start, end+1):
                    flag = 0
                    if i < 2:
                        continue
                    
                    for j in range(2, int(i**0.5)+1):
                        if not i%j:
                            flag = 1
                            break
                    
                    if flag:
                        continue
                    else:
                        print("{}是质数".format(i))
            \end{lstlisting}

            \item \begin{lstlisting}
                data = {
                    "020":"广州",
                    "021":"上海",
                    "022":"上海",
                    "023":"重庆",
                    "024":"沈阳",
                    "025":"南京"
                }

                while True:
                    code = input("请输入区号:")
                    if code in data.keys():
                        print(data[code])
                    else:
                        print("该区号不存在,请重新输入!")
            \end{lstlisting}
        \end{enumerate}
\end{document}